package times

import (
	"go-commons/utils"
	"time"
)

const (
	DateFormat        = "2006-01-02"
	TimeFormat        = "15:04:05"
	DateTimeFormat    = "2006-01-02 15:04:05"
	Time12HourFormat  = "2006-01-02 03:04:05 PM"
	MicrosecondFormat = "2006-01-02 15:04:05.999999"
)

// FormatDate 格式化日期为：年-月-日
func FormatDate(t time.Time) string {
	return t.Format(DateFormat)
}

// FormatTime 格式化时间（时:分:秒）
func FormatTime(t time.Time) string {
	return t.Format(TimeFormat)
}

// FormatDateTime 格式化日期为：年-月-日 时:分:秒
func FormatDateTime(t time.Time) string {
	return t.Format(DateTimeFormat)
}

// Format12Hour 格式化日期时间为12小时制（年-月-日 03:04:05 PM）
func Format12Hour(t time.Time) string {
	return t.Format(Time12HourFormat)
}

// FormatMicrosecond 格式化日期为：微秒精度（年-月-日 时:分:秒.微秒）
func FormatMicrosecond(t time.Time) string {
	return t.Format(MicrosecondFormat)
}

// CurrentTimestamp 获取当前时间戳
func CurrentTimestamp() int64 {
	return time.Now().Unix()
}

// CurrentStartTimestamp 获取当天零点时间戳 年-月-日 00:00:00
func CurrentStartTimestamp() int64 {
	now := time.Now()
	// 设置零点时间，保持年、月、日，小时、分钟、秒、纳秒都置为零
	return time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()).Unix()
}

// CurrentEndTimestamp 获取当天23点结束时间戳 年-月-日 23:59:59
func CurrentEndTimestamp() int64 {
	now := time.Now()
	// 设置结束时间，保持年、月、日，小时为23，分钟、秒、纳秒都为59
	return time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 999999999, now.Location()).Unix()
}

// CustomFormat 自定义日期格式化
func CustomFormat(t time.Time, layout string) string {
	return t.Format(layout)
}

// ParseTime 解析日期为时间
func ParseTime(date, layout string) *time.Time {
	parseTime, err := time.Parse(layout, date)
	return utils.EitherOr(err != nil, nil, &parseTime)
}

// ParseTimestamp 解析为时间戳
func ParseTimestamp(date, layout string) int64 {
	parseTime, err := time.Parse(layout, date)
	return utils.EitherOr(err != nil, 0, parseTime.Unix())
}
